package com.wang.myreflect;

import java.lang.reflect.Constructor;

/**
 * 获取构造方法
 * @author yandong
 */
public class MyReflectDemo2 {
    public static void main(String[] args) throws Exception {
        /*
         * Class类中用于获取构造方法的方法:
         * 1. Constructor<?>[] getConstructors()
         * 2. Constructor<?>[] getDeclaredConstructors()
         * 3. Constructor<T> getConstructor(Class<?>... parameterTypes)
         * 4. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
         *
         * Constructor类中用于创建对象的方法
         * 1. T newInstance(Object... initargs)
         * 2. setAccessible(boolean flag)
         */

        // 1.获取 Student的字节码文件class对象
        Class clazz = Class.forName("com.wang.myreflect.Student");

        // 2.获取所有public构造方法
        Constructor[] cons1 = clazz.getConstructors();
        for (Constructor con : cons1) {
            System.out.println(con);
        }

        System.out.println("===========================");

        // 3.获取所有构造方法
        Constructor[] cons2 = clazz.getDeclaredConstructors();
        for (Constructor con : cons2) {
            System.out.println(con);
        }

        System.out.println();
        System.out.println("=========================== ===========================");
        System.out.println();

        // 4.获取单个public构造方法

        // (1)获取空参的public构造方法
        Constructor con1 = clazz.getConstructor();
        System.out.println(con1);
        // (2)获取带参的public构造方法
        Constructor con2 = clazz.getConstructor(String.class, int.class);
        System.out.println(con2);

        System.out.println("===========================");


        // 5.获取单个非public的构造方法
        Constructor con3 = clazz.getDeclaredConstructor(String.class);
        System.out.println(con3);
        Constructor con4 = clazz.getDeclaredConstructor(int.class);
        System.out.println(con4);

        // 获取构造方法的权限修饰符
        int modifiers = con2.getModifiers();
        System.out.println(modifiers);

        // 利用反射获取到的构造方法创建对象
        Student stu1 = (Student) con2.newInstance("Tom", 12);
        System.out.println(stu1);

        // 暴力反射: 利用反射获取private的构造方法 并创建对象
        con4.setAccessible(true); // 临时取消权限校验
        Student stu2 = (Student) con4.newInstance(18);
        System.out.println(stu2);
    }
}
